%% 1. 读取图像并预处理
% 读取图像
gray_image = imread('processed_edges.png');

% 转为灰度图像
% gray_image = rgb2gray(image);

% 对比度增强
enhanced_image = imadjust(gray_image);

% 应用高斯模糊消除噪声
sigma = 2;
smoothed_image = imgaussfilt(enhanced_image, sigma);

% 保存预处理结果
imwrite(smoothed_image, 'smoothed_image.png');

%% 2. 边缘检测
% 使用 Canny 算子检测边缘
binary_image = edge(smoothed_image, 'Canny');

% 保存边缘检测结果
imwrite(binary_image, 'edges_canny.png');

%% 3. 提取竖线段
% 查找图像中的所有连通区域
connected_components = regionprops(binary_image, 'BoundingBox');

% 初始化用于存储线段的数组
line_segments = {};

% 遍历所有连通区域，筛选出竖线段
for k = 1:length(connected_components)
    % 获取当前连通区域的边界框
    bbox = connected_components(k).BoundingBox;
    x_min = round(bbox(1));
    y_min = round(bbox(2));
    width = round(bbox(3));
    height = round(bbox(4));

    % 筛选条件：竖线段的高度显著大于宽度
    if height > 50 && width < height * 0.2
        line_segments{end+1} = struct('x_min', x_min, 'x_max', x_min + width, ...
                                     'y_min', y_min, 'y_max', y_min + height, ...
                                     'height', height);
    end
end

%% 4. 显示检测到的所有竖线段
% 检测到的竖线段数
num_segments = length(line_segments);

% 检查是否有检测到的线段
if num_segments == 0
    disp('没有检测到符合条件的线段，请检查筛选条件或输入图像质量。');
else
    % 为每条直线段随机分配颜色
    colors = lines(num_segments); % 不同颜色

    % 显示图像并绘制所有直线段
    annotated_image = imread('smoothed_image.png');
    figure;
    imshow(annotated_image); hold on;

    for idx = 1:num_segments
        line_info = line_segments{idx};
        x_min = line_info.x_min;
        x_max = line_info.x_max;
        y_min = line_info.y_min;
        y_max = line_info.y_max;

        % 绘制线段
        plot([x_min, x_max], [y_min, y_max], '-', 'Color', colors(idx, :), 'LineWidth', 2);

        % 标注线段编号
        text(mean([x_min, x_max]), mean([y_min, y_max]), ...
            sprintf('#%d', idx), ...
            'Color', colors(idx, :), ...
            'FontSize', 12, ...
            'HorizontalAlignment', 'center');

        % 输出线段信息
        fprintf('直线段 #%d: x范围 [%d, %d], y范围 [%d, %d], 高度: %d\n', ...
            idx, x_min, x_max, y_min, y_max, line_info.height);
    end

    hold off;
    title('检测到的所有直线段');

    % 保存标注结果
    saveas(gcf, 'annotated_image.png');
end

%% 5. 测量竖线段间的距离
if num_segments >= 2
    % 按照 x_min 坐标对竖线段排序
    line_segments = sortrows(struct2table(cell2mat(line_segments)), 'x_min');

    % 计算两条平行竖线的间距
    x_left = line_segments{1}.x_min;
    x_right = line_segments{2}.x_min;
    distance_between_lines = abs(x_right - x_left);

    % 输出测量结果
    fprintf('两条竖线段的间距为: %.2f 像素\n', distance_between_lines);
else
    disp('检测到的竖线段不足两条，无法测量间距。');
end
